home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / common / langcode.c < prev    next >
C/C++ Source or Header  |  2004-05-10  |  11KB  |  370 lines

  1. /*-------------------------------------------------------------
  2.   langcode.c : convert language identifier to language code
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "common.h"
  10.  
  11. /* Globals */
  12.  
  13. BOOL LangIDToLangCode(char *dst, int langid, BOOL bCountry);
  14. BOOL FindFileWithLangCode(char *dst, int langid, const char* fname);
  15.  
  16. /* Statics */
  17.  
  18. static BOOL FindFileChinese(char *dst, int langid, const char* fname);
  19. static BOOL GetLangFileName(char *dst, const char *fname, const char *code);
  20.  
  21. #define LANG_KYRGYZ     0x40
  22. #define LANG_MONGOLIAN  0x50
  23. #define LANG_GALICIAN   0x56
  24. #define LANG_SYRIAC     0x5a
  25. #define LANG_DIVEHI     0x65
  26. #define LANG_INVARIANT  0x7f
  27.  
  28. /* Windows Primary Language Identifiers
  29.    and ISO 639 Language Code
  30.    http://www.oasis-open.org/cover/iso639a.html */
  31.  
  32. static struct {
  33.     int primlang;
  34.     char *code;
  35. } m_langcode[] = 
  36.  
  37. {
  38.     { LANG_NEUTRAL, NULL },
  39.     { LANG_ARABIC,      "ar" },
  40.     { LANG_BULGARIAN,   "bg" },
  41.     { LANG_CATALAN,     "ca" },
  42.     { LANG_CHINESE,     "zh" },
  43.     { LANG_CZECH,       "cs" },
  44.     { LANG_DANISH,      "da" },
  45.     { LANG_GERMAN,      "de" },
  46.     { LANG_GREEK,       "el" },
  47.     { LANG_ENGLISH,     "en" },
  48.     { LANG_SPANISH,     "es" },
  49.     { LANG_FINNISH,     "fi" },
  50.     { LANG_FRENCH,      "fr" },
  51.     { LANG_HEBREW,      "he" },
  52.     { LANG_HUNGARIAN,   "hu" },
  53.     { LANG_ICELANDIC,   "is" },
  54.     { LANG_ITALIAN,     "it" },
  55.     { LANG_JAPANESE,    "ja" },
  56.     { LANG_KOREAN,      "ko" },
  57.     { LANG_DUTCH,       "nl" },
  58.     { LANG_NORWEGIAN,   "no" },
  59.     { LANG_POLISH,      "pl" },
  60.     { LANG_PORTUGUESE,  "pt" },
  61.     { LANG_ROMANIAN,    "ro" },
  62.     { LANG_RUSSIAN,     "ru" },
  63.     { LANG_CROATIAN,    "hr" },
  64.     { LANG_SERBIAN,     "sr" },
  65.     { LANG_SLOVAK,      "sk" },
  66.     { LANG_ALBANIAN,    "sq" },
  67.     { LANG_SWEDISH,     "sv" },
  68.     { LANG_THAI,        "th" },
  69.     { LANG_TURKISH,     "tr" },
  70.     { LANG_URDU,        "ur" },
  71.     { LANG_INDONESIAN,  "id" },
  72.     { LANG_UKRAINIAN,   "uk" },
  73.     { LANG_BELARUSIAN,  "be" },
  74.     { LANG_SLOVENIAN,   "sl" },
  75.     { LANG_ESTONIAN,    "et" },
  76.     { LANG_LATVIAN,     "lv" },
  77.     { LANG_LITHUANIAN,  "lt" },
  78.     { LANG_FARSI,       "fa" }, /* PERSIAN */
  79.     { LANG_VIETNAMESE,  "vi" },
  80.     { LANG_ARMENIAN,    "hy" },
  81.     { LANG_AZERI,       "az" }, /* AZERBAIJANI ? */
  82.     { LANG_BASQUE,      "eu" },
  83.     { LANG_MACEDONIAN,  "mk" },
  84.     { LANG_AFRIKAANS,   "af" },
  85.     { LANG_GEORGIAN,    "ka" },
  86.     { LANG_FAEROESE,    "fo" },
  87.     { LANG_HINDI,       "hi" },
  88.     { LANG_MALAY,       "ms" },
  89.     { LANG_KAZAK,       "kk" },
  90.     { LANG_KYRGYZ,      "ky" },
  91.     { LANG_SWAHILI,     "sw" },
  92.     { LANG_UZBEK,       "uz" },
  93.     { LANG_TATAR,       "tt" },
  94.     { LANG_BENGALI,     "bn" },
  95.     { LANG_PUNJABI,     "pa" },
  96.     { LANG_GUJARATI,    "gu" },
  97.     { LANG_ORIYA,       "or" },
  98.     { LANG_TAMIL,       "ta" },
  99.     { LANG_TELUGU,      "te" },
  100.     { LANG_KANNADA,     "kn" },
  101.     { LANG_MALAYALAM,   "ml" },
  102.     { LANG_ASSAMESE,    "as" },
  103.     { LANG_MARATHI,     "mr" },
  104.     { LANG_SANSKRIT,    "sa" },
  105.     { LANG_MONGOLIAN,   "mn" },
  106.     { LANG_GALICIAN,    "gl" },
  107.     { LANG_SINDHI,      "sd" },
  108.     { LANG_KASHMIRI,    "ks" },
  109.     { LANG_NEPALI,      "ne" },
  110.     { LANG_INVARIANT,   NULL },
  111.     { -1, NULL }
  112. };
  113.  
  114. /* Windows SubLanguage Identifiers
  115.    and ISO 3166 Country Code
  116.    http://www.oasis-open.org/cover/country3166.html */
  117.  
  118. static struct {
  119.     int primlang;
  120.     int sublang;
  121.     char *code;
  122. } m_countrycode[] = 
  123.  
  124. {
  125.     { LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA,        "sa" },
  126.     { LANG_ARABIC, SUBLANG_ARABIC_IRAQ,                "iq" },
  127.     { LANG_ARABIC, SUBLANG_ARABIC_EGYPT,               "eg" },
  128.     { LANG_ARABIC, SUBLANG_ARABIC_LIBYA,               "ly" },
  129.     { LANG_ARABIC, SUBLANG_ARABIC_ALGERIA,             "dz" },
  130.     { LANG_ARABIC, SUBLANG_ARABIC_MOROCCO,             "ma" },
  131.     { LANG_ARABIC, SUBLANG_ARABIC_TUNISIA,             "tn" },
  132.     { LANG_ARABIC, SUBLANG_ARABIC_OMAN,                "om" },
  133.     { LANG_ARABIC, SUBLANG_ARABIC_YEMEN,               "ye" },
  134.     { LANG_ARABIC, SUBLANG_ARABIC_SYRIA,               "sy" },
  135.     { LANG_ARABIC, SUBLANG_ARABIC_JORDAN,              "jo" },
  136.     { LANG_ARABIC, SUBLANG_ARABIC_LEBANON,             "lb" },
  137.     { LANG_ARABIC, SUBLANG_ARABIC_KUWAIT,              "kw" },
  138.     { LANG_ARABIC, SUBLANG_ARABIC_UAE,                 "ae" },
  139.     { LANG_ARABIC, SUBLANG_ARABIC_BAHRAIN,             "bh" },
  140.     { LANG_ARABIC, SUBLANG_ARABIC_QATAR,               "qa" },
  141.     { LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL,       "tw" },  /* Taiwan */
  142.     { LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED,        "cn" },  /* PRC */
  143.     { LANG_CHINESE, SUBLANG_CHINESE_HONGKONG,          "hk" },
  144.     { LANG_CHINESE, SUBLANG_CHINESE_SINGAPORE,         "sg" },
  145.     { LANG_CHINESE, SUBLANG_CHINESE_MACAU,             "mo" },
  146.     { LANG_DUTCH,   SUBLANG_DUTCH,                     "nl" },
  147.     { LANG_DUTCH,   SUBLANG_DUTCH_BELGIAN,             "be" }, 
  148.     { LANG_ENGLISH, SUBLANG_ENGLISH_US,                "us" },
  149.     { LANG_ENGLISH, SUBLANG_ENGLISH_UK,                "gb" },
  150.     { LANG_ENGLISH, SUBLANG_ENGLISH_AUS,               "au" },
  151.     { LANG_ENGLISH, SUBLANG_ENGLISH_CAN,               "ca" },
  152.     { LANG_ENGLISH, SUBLANG_ENGLISH_NZ,                "nz" },
  153.     { LANG_ENGLISH, SUBLANG_ENGLISH_EIRE,              "ie" },
  154.     { LANG_ENGLISH, SUBLANG_ENGLISH_SOUTH_AFRICA,      "za" },
  155.     { LANG_ENGLISH, SUBLANG_ENGLISH_JAMAICA,           "jm" },
  156.     { LANG_ENGLISH, SUBLANG_ENGLISH_BELIZE,            "bz" },
  157.     { LANG_ENGLISH, SUBLANG_ENGLISH_TRINIDAD,          "tt" },
  158.     { LANG_ENGLISH, SUBLANG_ENGLISH_ZIMBABWE,          "zw" },
  159.     { LANG_ENGLISH, SUBLANG_ENGLISH_PHILIPPINES,       "ph" },
  160.     { LANG_FRENCH,  SUBLANG_FRENCH,                    "fr" },
  161.     { LANG_FRENCH,  SUBLANG_FRENCH_BELGIAN,            "be" },
  162.     { LANG_FRENCH,  SUBLANG_FRENCH_CANADIAN,           "ca" },
  163.     { LANG_FRENCH,  SUBLANG_FRENCH_SWISS,              "ch" },
  164.     { LANG_FRENCH,  SUBLANG_FRENCH_LUXEMBOURG,         "lu" },
  165.     { LANG_FRENCH,  SUBLANG_FRENCH_MONACO,             "mc" },
  166.     { LANG_GERMAN,  SUBLANG_GERMAN,                    "de" },
  167.     { LANG_GERMAN,  SUBLANG_GERMAN_SWISS,              "ch" },
  168.     { LANG_GERMAN,  SUBLANG_GERMAN_AUSTRIAN,           "at" },
  169.     { LANG_GERMAN,  SUBLANG_GERMAN_LUXEMBOURG,         "lu" },
  170.     { LANG_GERMAN,  SUBLANG_GERMAN_LIECHTENSTEIN,      "li" },
  171.     { LANG_ITALIAN, SUBLANG_ITALIAN,                   "it" },
  172.     { LANG_ITALIAN, SUBLANG_ITALIAN_SWISS,             "ch" },
  173.     { LANG_KOREAN,  SUBLANG_KOREAN,                    "kr" },
  174.     { LANG_LITHUANIAN, SUBLANG_LITHUANIAN,             "lt" },
  175.     { LANG_MALAY,   SUBLANG_MALAY_MALAYSIA,            "my" },
  176.     { LANG_MALAY,   SUBLANG_MALAY_BRUNEI_DARUSSALAM,   "bn" },
  177.     { LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN,   "br" },
  178.     { LANG_PORTUGUESE, SUBLANG_PORTUGUESE,             "pt" },
  179.     { LANG_SPANISH, SUBLANG_SPANISH,                   "es" },
  180.     { LANG_SPANISH, SUBLANG_SPANISH_MEXICAN,           "mx" },
  181.     { LANG_SPANISH, SUBLANG_SPANISH_GUATEMALA,         "gt" },
  182.     { LANG_SPANISH, SUBLANG_SPANISH_COSTA_RICA,        "cr" },
  183.     { LANG_SPANISH, SUBLANG_SPANISH_PANAMA,            "pa" },
  184.     { LANG_SPANISH, SUBLANG_SPANISH_VENEZUELA,         "ve" },
  185.     { LANG_SPANISH, SUBLANG_SPANISH_COLOMBIA,          "co" },
  186.     { LANG_SPANISH, SUBLANG_SPANISH_PERU,              "pe" },
  187.     { LANG_SPANISH, SUBLANG_SPANISH_ARGENTINA,         "ar" },
  188.     { LANG_SPANISH, SUBLANG_SPANISH_ECUADOR,           "ec" },
  189.     { LANG_SPANISH, SUBLANG_SPANISH_CHILE,             "cl" },
  190.     { LANG_SPANISH, SUBLANG_SPANISH_URUGUAY,           "uy" },
  191.     { LANG_SPANISH, SUBLANG_SPANISH_PARAGUAY,          "py" },
  192.     { LANG_SPANISH, SUBLANG_SPANISH_BOLIVIA,           "bo" },
  193.     { LANG_SPANISH, SUBLANG_SPANISH_EL_SALVADOR,       "sv" },
  194.     { LANG_SPANISH, SUBLANG_SPANISH_HONDURAS,          "hn" },
  195.     { LANG_SPANISH, SUBLANG_SPANISH_NICARAGUA,         "ni" },
  196.     { LANG_SPANISH, SUBLANG_SPANISH_PUERTO_RICO,       "pr" },
  197.     { LANG_SWEDISH, SUBLANG_SWEDISH,                   "se" },
  198.     { LANG_SWEDISH, SUBLANG_SWEDISH_FINLAND,           "fi" },
  199.     { LANG_URDU,    SUBLANG_URDU_PAKISTAN,             "pk" },
  200.     { LANG_URDU,    SUBLANG_URDU_INDIA,                "in" },
  201.     { -1, -1, NULL }
  202. };
  203.  
  204. /* Externs */
  205. extern char g_mydir[];
  206.  
  207. /*--------------------------------------------------------
  208.   convert Windows language identifier
  209.         to RFC3066 language code
  210. ----------------------------------------------------------*/
  211. BOOL LangIDToLangCode(char *dst, int langid, BOOL bCountry)
  212. {
  213.     int prim, sub;
  214.     int i;
  215.     
  216.     prim = PRIMARYLANGID((WORD)langid);
  217.     sub  = SUBLANGID((WORD)langid);
  218.     
  219.     *dst = 0;
  220.     for(i = 0; m_langcode[i].primlang >= 0; i++)
  221.     {
  222.         if(m_langcode[i].primlang == prim)
  223.         {
  224.             if(m_langcode[i].code)
  225.                 strcpy(dst, m_langcode[i].code);
  226.             break;
  227.         }
  228.     }
  229.     if(m_langcode[i].primlang < 0) return FALSE;
  230.     
  231.     if(!bCountry) return TRUE;
  232.     
  233.     for(i = 0; m_countrycode[i].sublang >= 0; i++)
  234.     {
  235.         if(m_countrycode[i].primlang == prim &&
  236.             m_countrycode[i].sublang == sub)
  237.         {
  238.             if(m_countrycode[i].code)
  239.             {
  240.                 strcat(dst, "-");
  241.                 strcat(dst, m_countrycode[i].code);
  242.             }
  243.             break;
  244.         }
  245.     }
  246.     return TRUE;
  247. }
  248.  
  249. /*--------------------------------------------------------
  250.   find  tclang-en-us.txt or tclang-en.txt or tclang.txt
  251. ----------------------------------------------------------*/
  252. BOOL FindFileWithLangCode(char *dst, int langid, const char* fname)
  253. {
  254.     char code[20];
  255.     
  256.     if(LangIDToLangCode(code, langid, TRUE))
  257.     {
  258.         if(GetLangFileName(dst, fname, code))
  259.             return TRUE;
  260.         
  261.         if(PRIMARYLANGID((WORD)langid) == LANG_CHINESE)
  262.         {
  263.             if(FindFileChinese(dst, langid, fname)) return TRUE;
  264.         }
  265.         
  266.         if(LangIDToLangCode(code, langid, FALSE))
  267.         {
  268.             if(GetLangFileName(dst, fname, code))
  269.                 return TRUE;
  270.         }
  271.     }
  272.     
  273.     if(GetLangFileName(dst, fname, "")) return TRUE;
  274.     return FALSE;
  275. }
  276.  
  277. BOOL FindFileChinese(char *dst, int langid, const char* fname)
  278. {
  279.     char code[20];
  280.     int prim = PRIMARYLANGID((WORD)langid);
  281.     int sub = SUBLANGID((WORD)langid);
  282.     int trad[3] = { SUBLANG_CHINESE_TRADITIONAL, 
  283.           SUBLANG_CHINESE_HONGKONG,
  284.           SUBLANG_CHINESE_MACAU };
  285.     int simp[2] = { SUBLANG_CHINESE_SIMPLIFIED,
  286.           SUBLANG_CHINESE_SINGAPORE };
  287.     int i, j;
  288.     
  289.     for(i = 0; i < 3; i++)
  290.     {
  291.         if(sub == trad[i])
  292.         {
  293.             for(j = 0; j < 3; j++)
  294.             {
  295.                 if(sub != trad[j])
  296.                 {
  297.                     int langid2 = MAKELANGID(prim, trad[j]);
  298.                     
  299.                     if(LangIDToLangCode(code, langid2, TRUE))
  300.                     {
  301.                         if(GetLangFileName(dst, fname, code))
  302.                             return TRUE;
  303.                     }
  304.                 }
  305.             }
  306.         }
  307.     }
  308.     for(i = 0; i < 2; i++)
  309.     {
  310.         if(sub == simp[i])
  311.         {
  312.             for(j = 0; j < 2; j++)
  313.             {
  314.                 if(sub != simp[j])
  315.                 {
  316.                     int langid2 = MAKELANGID(prim, simp[j]);
  317.                     
  318.                     if(LangIDToLangCode(code, langid2, TRUE))
  319.                     {
  320.                         if(GetLangFileName(dst, fname, code))
  321.                             return TRUE;
  322.                     }
  323.                 }
  324.             }
  325.         }
  326.     }
  327.     
  328.     return FALSE;
  329. }
  330.  
  331.  
  332. BOOL GetLangFileName(char *dst, const char *fname, const char *code)
  333. {
  334.     char title[MAX_PATH], ext[20];
  335.     
  336.     strcpy(title, fname);
  337.     del_ext(ext, title);
  338.     
  339.     strcpy(dst, g_mydir);
  340.     add_title(dst, title);
  341.     
  342.     if(code[0])
  343.     {
  344.         strcat(dst, "-"); strcat(dst, code);
  345.     }
  346.     if(ext[0])
  347.     {
  348.         strcat(dst, "."); strcat(dst, ext);
  349.     }
  350.     
  351.     if(IsFile(dst)) return TRUE;
  352.     
  353.     strcpy(dst, g_mydir);
  354.     add_title(dst, LANGDIR);
  355.     add_title(dst, title);
  356.     
  357.     if(code[0])
  358.     {
  359.         strcat(dst, "-"); strcat(dst, code);
  360.     }
  361.     if(ext[0])
  362.     {
  363.         strcat(dst, "."); strcat(dst, ext);
  364.     }
  365.     
  366.     if(IsFile(dst)) return TRUE;
  367.     
  368.     return FALSE;
  369. }
  370.